﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using System.IO;


namespace Prassi2ExpertUpTransfer
{
    public class ConversioneCodici
    {
        private Dictionary<string, Dictionary<string, string>> convCodici = new Dictionary<string, Dictionary<string, string>>();

        public ConversioneCodici(string codiceDitta, string path_trasfer)
        {
            string fileTxt, tipoCodice, codPrassi, codExpertUp;
            string baseDir = Path.GetDirectoryName(path_trasfer);

            try
            {
                fileTxt = baseDir + @"\ConversioneCodiciPrassiExpertUp_" + codiceDitta + ".dat";

                if (!File.Exists(fileTxt))
                {
                    // se il file non esiste... creo la tabella conversione codice ditta assunto
                    CaricaTabella("CodiceDitta", codiceDitta.Trim(), codiceDitta.Trim());
                }
                else
                {
                    // percorso e nome file al costruttore StreamReader
                    StreamReader sr = new StreamReader(fileTxt);
                    String line = null;

                    // lettura del file di testo con i codici da pulire
                    while ((line = sr.ReadLine()) != null)
                    {
                        // non elaboro le righe di commento
                        if (!line.StartsWith("#"))
                        {
                            // arresto il caricamento dei codici di conversione Prassi-->ExpertUp
                            if (line.StartsWith("STOP_CONVERSIONE_CODICI"))
                            {
                                break;
                            }

                            string[] valoriRiga = line.Split(';');

                            tipoCodice = valoriRiga[0].Trim();
                            codPrassi = valoriRiga[1].Trim();
                            codExpertUp = valoriRiga[2].Trim();

                            CaricaTabella(tipoCodice, codPrassi, codExpertUp);

                        }
                    }

                    // chiusura del file di testo
                    sr.Close();
                }

            }
            catch (Exception err)
            {
                // TODO Exception rilanciata
                throw err;
            }

        }


        private void CaricaTabella(string tipoCodice, string codPrassi, string codExpertUp)
        {

            if (!this.convCodici.ContainsKey(tipoCodice))
            {
                this.convCodici.Add(tipoCodice, new Dictionary<string, string>());
            }


            if (!this.convCodici[tipoCodice].ContainsKey(codPrassi))
            {
                this.convCodici[tipoCodice].Add(codPrassi, codExpertUp);
            }
            else
            {
                this.convCodici[tipoCodice][codPrassi] = codExpertUp;
            }
        }

        public string CodiceExpertUp(string tipoCodice, string codPrassi)
        {
            string codiceExpertUp = null;

            if (this.convCodici.ContainsKey(tipoCodice))
            {
                if (this.convCodici[tipoCodice].ContainsKey(codPrassi))
                {
                    codiceExpertUp = this.convCodici[tipoCodice][codPrassi];
                }

            }

            // se NON trovato restituisce errore
            if (codiceExpertUp == null)
            {
                // TODO Exception ConversioneCodiceNonRiuscita
                throw new Eccezioni.ConversioneCodiceNonRiuscitaException(tipoCodice, codPrassi);
            }


            return codiceExpertUp;
        }


        // stampa dei dati 
        public void stampaDati()
        {
            Dictionary<string, string> codPrasExper = new Dictionary<string, string>();

            foreach (KeyValuePair<string, Dictionary<string, string>> tipoCodice in convCodici)
            {

                System.Console.WriteLine("Tipo Codice = {0} ", tipoCodice.Key);

                
                foreach (KeyValuePair<string, string> codPrasExpr in tipoCodice.Value)
                {
                    System.Console.WriteLine("Codice Prassi = {0} Codice ExpertUp = {1}", codPrasExpr.Key, codPrasExpr.Value);
                }
            }
        }
    }
}